#!/bin/bash
echo "===== 开始磁盘性能测试 ====="
# 记录开始时间
start_time=$(date +%s.%N)
# 设置阈值和参数
IOWAIT_THRESHOLD=10.0  # I/O等待时间阈值（百分比）
MAX_RETRIES=3          # 最大重试次数
# 磁盘性能测试与调优
for disk in $(lsblk | awk '{print $1}' | grep -v 'node|mount|/dev/sda'); do
    echo "=== 测试磁盘: $disk ==="
    # 记录原始I/O负载
    original_iowait=$(iostat -d -x $disk 2 | tail -n 1 | awk '{print $4}')
    # 磁盘性能测试
    if [ $(echo "$original_iowait > $IOWAIT_THRESHOLD" | bc) -eq 1 ]; then
        echo "检测到高I/O等待时间：$original_iowait%"
        # 尝试调整内核参数以优化磁盘I/O
        for attempt in $(seq 1 $MAX_RETRIES); do
            echo "尝试优化第${attempt}次..."
            # 调整ioScheduler参数
            if [ "$disk" == "/dev/sda" ]; then
                sudo sysctl -p > /dev/null && echo "已应用系统配置文件"
                sudo hdparm -W 1 $disk > /dev/null && echo "已启用写入缓存超时"
                sudo blktrace -d $disk -o trace_output.log -w 60 > /dev/null && echo "开始捕获磁盘迹"
                # 使用fio进行压力测试以验证性能
                fio --filename=/tmp/testfile --direct=1 --rw=readwrite --bs=4k --size=1G --num_jobs=4 --runtime=60 > fio_output.log
                # 分析fio结果
                IOWAIT_AFTER_FIO=$(iostat -d -x $disk 2 | tail -n 1 | awk '{print $4}')
                if [ $(echo "$IOWAIT_AFTER_FIO < $original_iowait" | bc) -eq 1 ]; then
                    echo "磁盘性能优化成功，I/O等待时间降低"
                    break
                else
                    echo "优化未生效或情况恶化，正在恢复..."
                    # 恢复默认配置
                    sudo sysctl -p > /dev/null && echo "已应用系统配置文件"
                    rm -f trace_output.log fio_output.log > /dev/null
                fi
            fi
            # 如果尝试次数用尽仍未解决问题，则记录错误日志
            if [ $attempt == $MAX_RETRIES ]; then
                echo "多次优化未成功，建议检查磁盘硬件或服务配置"
                exit 1
            fi
        done
    else
        echo "当前I/O等待时间正常：$original_iowait%"
    fi
    # 结构化输出性能指标
    echo "=== 性能指标 ==="
    echo '{
    "磁盘名称": "'$disk'",
    "原始IOWAIT%": '$original_iowait',
    "优化后IOWAIT%": '$IOWAIT_AFTER_FIO'
}'
done
# 记录结束时间
end_time=$(date +%s.%N)
duration=$(echo "$end_time - $start_time" | bc)
# 整体调优总结
echo "===== 调整摘要 ====="
echo "总执行时间: ${duration}秒"
echo "磁盘I/O负载已监控并优化，服务稳定性应有所提升"
# 结构化输出最终报告
echo "===== 性能调整报告 ====="
echo '{
    "total_time": "'$duration'",
    "optimized_disks": {
        "disk1": {
            "original_iowait%": '$original_iowait',
            "optimized_iowait%": '$IOWAIT_AFTER_FIO'
        }
    },
    "status": "优化完成"
}'